package com.example.zhoutao.puzzle.Utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.WindowManager;
import com.example.zhoutao.puzzle.UI.PuzzleView;
import com.example.zhoutao.puzzle.module.ImagePiece;
import java.util.ArrayList;
import java.util.List;

/**
 *Created by ZT on 2019.3.18
 * 工具类——切割图片
 */
public class Utils {

    /**
     * 返回屏幕的宽高，用数组返回
     * 下标0，width。 下标1，height。
     *
     * @param context
     * @return
     */
    public static int[] getScreenWidth(Context context) {
        context = context.getApplicationContext();
        WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        manager.getDefaultDisplay().getMetrics(outMetrics);

        //获取当前屏幕的长宽
        int width = outMetrics.widthPixels;
        int height = outMetrics.heightPixels;
        int[] size = new int[2];
        size[0] = width;
        size[1] = height;
        return size;
    }

    /**
     * 传入一个bitmap 返回一个piece集合
     *
     * @param context
     * @param bitmap
     * @param count
     * @param gameMode
     * @return
     */
    public static List<ImagePiece> splitImage(Context context, Bitmap bitmap, int count, String gameMode) {

        List<ImagePiece> imagePieces = new ArrayList<>();
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        //保证拼图区域为正方形，求得每一块图块的边长
        int picWidth = Math.min(width, height) / count;

        for (int i = 0; i < count; i++) {
            for (int j = 0; j < count; j++) {
                ImagePiece imagePiece = new ImagePiece();

                //对图块编号
                imagePiece.setIndex(j + i * count);

                //为createBitmap 切割图片获取xy
                int x = j * picWidth;
                int y = i * picWidth;
                if (gameMode.equals(PuzzleView.GAME_MODE_NORMAL)) {
                    if (i == count - 1 && j == count - 1) {
                        imagePiece.setType(ImagePiece.TYPE_EMPTY);
                        //Bitmap emptyBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.empty);
                        //imagePiece.setBitmap(emptyBitmap);
                    } else {
                        imagePiece.setBitmap(Bitmap.createBitmap(bitmap, x, y, picWidth, picWidth));
                    }
                } else {
                    imagePiece.setBitmap(Bitmap.createBitmap(bitmap, x, y, picWidth, picWidth));
                }
                imagePieces.add(imagePiece);
            }
        }
        return imagePieces;
    }

    /**
     * 读取图片，按照缩放比例保持长宽比例返回bitmap对象
     *
     * @param context
     * @param res
     * @param scale 缩放比例
     * @return Bitmap
     */
    public synchronized static Bitmap readBitmap(Context context, int res, int scale) {
        try {
            //Options，此类用于解码Bitmap时的各种参数控制
            BitmapFactory.Options options = new BitmapFactory.Options();

            //如果将这个值置为true，那么在解码的时候将不会返回bitmap，只会返回这个bitmap的尺寸。这个属性的目的是，如果你只想知道一个bitmap的尺寸，但又不想将其加载到内存时。这是一个非常有用的属性。
            options.inJustDecodeBounds = false;

            //确定缩放比例，按照1/inSampleSize比例缩放
            options.inSampleSize = scale;

            //这两个值一般是一起使用，设置为true时，前者表示空间不够是否可以被释放，后者表示是否可以共享引用。这两个值在Android5.0后被弃用。
            options.inPurgeable = true;
            options.inInputShareable = true;

            //这个值是设置色彩模式，默认值是ARGB_8888，在这个模式下，一个像素点占用4bytes空间，一般对透明度不做要求的话，一般采用RGB_565模式，这个模式下一个像素点占用2bytes。
            options.inPreferredConfig = Bitmap.Config.RGB_565;



            //第一个参数是包含你要加载的位图资源文件的对象；第二个是需要加载的位图资源的id
            return BitmapFactory.decodeResource(context.getResources(), res, options);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 不设参数的数组中找到最小值
     * @param params
     * @return 最小值
     */
    public static int getMinLength(int... params) {
        int min = params[0];
        for (int para : params) {
            if (para < min) {
                min = para;
            }
        }
        return min;
    }

    /**
     * dp->px
     *  标准单位: px (px是安卓系统内部使用的单位, dp是与设备无关的尺寸单位 )
     * 非标准单位: dp, in, mm, pt, sp
     * TypedValue.applyDimension()方法的功能就是把非标准尺寸转换成标准尺寸
     * @param context
     * @param dpval
     * @return
     */
    public static int dp2px(Context context, int dpval) {
        context = context.getApplicationContext();
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpval, context.getResources().getDisplayMetrics());
    }
}
